import threading,time
"""
线程间通讯
与多进程的内存独立不同，多线程间可以共享内存，所以同一个变量是可以被多个线程共享的，不需要额外的插件。
想要让多个线程能同时操作某变量，要么将该变量作为参数传递到线程中（必须是可变变量，例如list和dict），
要么作为全局变量在线程中用global关键字进行声明。

因为有GIL的存在，每次只能有一个线程在对变量进行操作，有人就认为python不需要互斥锁了。但是实际情况却和我们想的相差很远，先看下面这个例子
        
原文链接：https://blog.csdn.net/Victor2code/rticle/details/109005171
"""
def increase(var):
    global total_increase_times
    for i in range(1000000):
        var[0] += 1
        total_increase_times += 1


def decrease(var):
    global total_decrease_times
    for i in range(1000000):
        var[0] -= 1
        total_decrease_times -= 1


if __name__ == '__main__':
    print('main thread is {}'.format(threading.current_thread().name))
    start_time = time.time()
    var = [5]
    total_increase_times = 0
    total_decrease_times = 0
    t1 = threading.Thread(target=increase, args=(var,))
    t2 = threading.Thread(target=decrease, args=(var,))
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print(var)
    print('total increase times: {}'.format(str(total_increase_times)))
    print('total decrease times: {}'.format(str(total_decrease_times)))
    end_time = time.time()
    print('total time is {}'.format(str(end_time - start_time)))
"""
main thread is MainThread
[-337495]
total increase times: 1000000
total decrease times: -1000000
total time is 0.18605351448059082
"""

"""
这是因为某些在我们看来是原子操作的，例如+或者-，在python看来不是的。例如执行a+=1操作，
在python看来其实是三步：获取a的值，将值加1，将新的值赋给a。
在这三步中的任意位置，该线程都有可能被暂停，然后让别的线程先运行。
"""